package com.ross.mode.factory;

import com.ross.mode.utils.ClassLoaderUtils;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 在代理类的实现中其实也非常简单，通过穿透进来的集群服务进行方法操作。
 * 另外在invoke中通过使用获取方法名称反射方式，调用对应的方法功能，也就简化了整体的使用。
 * 到这我们就已经将整体的功能实现完成了，关于抽象工厂这部分也可以使用非代理的方式进行实现。
 * 每一个动态代理类的调用处理程序都必须实现InvocationHandler接口，
 *
 * @version 1.0.0
 * @className: JDKInvocationHandler
 * @description:
 * @author: zhangjunfa
 * @date: 2023/3/30 16:10
 */
public class JDKInvocationHandler implements InvocationHandler {
    private ICacheAdapter cacheAdapter;

    /**
     * 构造器
     *
     * @param cacheAdapter
     */
    public JDKInvocationHandler(ICacheAdapter cacheAdapter) {
        this.cacheAdapter = cacheAdapter;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return ICacheAdapter.class.getMethod(method.getName(), ClassLoaderUtils.getClazzByArgs(args)).invoke(cacheAdapter, args);
    }
}
